//
//  NSObject+Runtime.h
//  OMTCoreKit
//
//  Created by 昭荣伊 on 2018/7/27.
//

#import <Foundation/Foundation.h>

@interface NSObject (Runtime)

#pragma mark - Swap method (Swizzling)
///=============================================================================
/// @name Swap method (Swizzling)
///=============================================================================

/**
 替换self的实例方法实现，将 `originalSel` 的实现替换成 `targetSel` 的实现。
 
 @param originalSel        原方法
 @param targetSel        目标方法
 @return                如果替换成功返回 YES；否则，NO。
 */
+ (BOOL)omt_swizzleInstanceMethod:(SEL)originalSel targetSel:(SEL)targetSel;

/**
 将self的实例方法 `originalSel` 的实现，替换成 `targetClass` 的实例方法 `targetSel` 的实现。
 
 @param originalSel        原方法
 @param targetClass        目标类
 @param targetSel        目标方法
 @return                如果替换成功返回 YES；否则，NO。
 */
+ (BOOL)omt_swizzleInstanceMethod:(SEL)originalSel targetClass:(Class)targetClass targetSel:(SEL)targetSel;

/**
 替换两个类的实例方法实现，将 `originalClass` 的实例方法 `originalSel` 的实现，替换成 `targetClass` 的实例方法 `targetSel` 的实现。
 
 @param originalClass   原类
 @param originalSel        原方法
 @param targetClass        目标类
 @param targetSel        目标方法
 @return                如果替换成功返回 YES；否则，NO。
 */
+ (BOOL)omt_swizzleInstanceMethod:(Class)originalClass originalSel:(SEL)originalSel targetClass:(Class)targetClass targetSel:(SEL)targetSel;

/**
 替换self class的类方法实现，将 `originalSel` 替换成 `targetSel` 的实现。
 
 @param originalSel        原类方法
 @param targetSel        目标类方法
 @return                如果替换成功返回 YES；否则，NO。
 */
+ (BOOL)omt_swizzleClassMethod:(SEL)originalSel targetSel:(SEL)targetSel;

/**
 将self class的 `originalSel` 类方法实现，替换成 `targetClass` 的类方法 `targetSel` 的实现。
 
 @param originalSel        原类方法
 @param targetClass        目标类
 @param targetSel        目标类方法
 @return                如果替换成功返回 YES；否则，NO。
 */
+ (BOOL)omt_swizzleClassMethod:(SEL)originalSel targetClass:(Class)targetClass targetSel:(SEL)targetSel;

/**
 替换两个类的类方法实现，将 `originalClass` 的类方法 `OriginalSel`的实现，替换成 `targetClass` 的类方法 `targetSel`的实现。
 
 @param originalClass   原类
 @param originalSel        原类方法
 @param targetClass        目标类
 @param targetSel        目标类方法
 @return                如果替换成功返回 YES；否则，NO。
 */
+ (BOOL)omt_swizzleClassMethod:(Class)originalClass originalSel:(SEL)originalSel targetClass:(Class)targetClass targetSel:(SEL)targetSel;

@end
